
由左到右,由上至下,分別是
時間越來越不夠了0rz
建立Rich Menu模板,取得Rich MenuID,上傳圖片至Line,將圖片與RichMenu綁定,將該Rich Menu設定為預設
tester.py
def doline(dbpm:DBPm, args):
    line_bot_api = LineBotApi(os.environ['LCAT'])
    if(args.target == 'rich_menu_create'):
        print("以預設值建立新的Rich Menu")
        r = init_default_rich_menu(line_bot_api=line_bot_api, yes=args.yes)
    elif(args.target == 'rich_menu_img_upload'):
        print("上傳Rich Menu 圖片")
        r = add_upload_rich_menu_img(line_bot_api=line_bot_api, yes=args.yes)
    elif(args.target == 'show_rich_menu_list'):
        print("顯示Rich Menu列表")
        r = info_get_rich_menu_list(line_bot_api=line_bot_api)
    elif(args.target == 'get_default_rich_menu'):
        print("顯示預設Rich Menu")
        r = info_get_default_rich_menu(line_bot_api=line_bot_api)
    elif(args.target == 'set_default_rich_menu'):
        print("設定預設的Rich Menu")
        r = add_set_default_rich_menu(line_bot_api = line_bot_api, yes=args.yes)
    elif(args.target == 'cancel_default_rich_menu'):
        print("取消預設的Rich Menu")
        r = del_cancel_default_rich_menu(line_bot_api=line_bot_api, yes=args.yes)
    elif(args.target == 'delete_rich_menu'):
        print("刪除Rich Menu")
        r = del_delete_rich_menu(line_bot_api=line_bot_api, yes=args.yes)
    if(r):print("成功")
    else:print("失敗")
def init_default_rich_menu(line_bot_api:LineBotApi, yes=False):
    if(not yes):yes = askyes()
    if(not yes):return False
    areas = [RichMenuArea(
                bounds=RichMenuBounds(x=0, y=0, width=512, height=512),
                action=URIAction(label='Go to line.me', uri='https://line.me')
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=512, y=0, width=512, height=512),
                action=URIAction(label='Go to line.me', uri='https://line.me')
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=1024, y=0, width=512, height=512),
                action=URIAction(label='Go to line.me', uri='https://line.me')
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=0, y=512, width=512, height=512),
                action=MessageAction(label="按下問號按鈕", text="顯示操作說明")
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=512, y=512, width=512, height=512),
                action=PostbackAction(
                    label="顯示購物車內容",
                    data="action=ShowShoppingCartContents",
                    display_text="我的購物車內有什麼"
                )
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=1024, y=512, width=512, height=512),
                action=PostbackAction(
                    label="查詢訂單",
                    data="action=ShowOrderStatus",
                    display_text="查詢訂單"
                )            
            )
        ]
    richmenuid = linecc.Create_Rich_Menu(line_bot_api, 1536, 1024, "default_Rich_Menu", "主選單", areas)
    print(f"rich_menu_id :{richmenuid}")
    if(richmenuid):return True
    else:return False
def add_upload_rich_menu_img(line_bot_api:LineBotApi, fp:str="./template/rm_01.png", yes=False):
    richmenuid = input("RichMenuId:")
    if(not richmenuid):return False
    fp = input(f"Default({fp}) or Enter:") or fp
    isvalid = os.path.exists(fp)
    print(f"Try load rich menu image from {fp}.....{isvalid}")
    if(not isvalid):return False
    if(not yes):yes = askyes()
    if(not yes):return False
    return linecc.Upload_Rich_Menu(line_bot_api, fp, richmenuid)
def add_set_default_rich_menu(line_bot_api:LineBotApi, timeout=None, yes=False):
    rich_menu_id = input("Rich Menu ID:")
    if(not yes):yes = askyes()
    if(not yes):return False
    line_bot_api.set_default_rich_menu(rich_menu_id)
    return True
linecc.py
def Upload_Rich_Menu(line_bot_api:LineBotApi, file_path, rich_menu_id):
    extension = os.path.splitext(file_path)[1]
    if(extension == '.jpg' or extension == '.jpeg'):
        content_type = 'image/jpeg'
    elif(extension == '.png'):
        content_type = 'image/png'
    else:
        print(f"副檔名不正確", extension)
        return False
    with open(file_path, 'rb') as f:
        line_bot_api.set_rich_menu_image(rich_menu_id, content_type, f)
    return True
def get_rich_menu_list(line_bot_api:LineBotApi, timeout=None):
    rich_menu_list = line_bot_api.get_rich_menu_list(timeout=timeout)
    return rich_menu_list
def Create_Rich_Menu(line_bot_api:LineBotApi, image_width:int, image_height:int, name:str, char_bar_text:str, richmenuarea):
    rich_menu_to_create = RichMenu(
        size=RichMenuSize(width=image_width, height=image_height),
        selected=False,
        name=name,
        chat_bar_text=char_bar_text,
        areas=richmenuarea
    )
    rich_menu_id = line_bot_api.create_rich_menu(rich_menu=rich_menu_to_create)
    return rich_menu_id
處理PostBack Evevnt,查詢資料庫,傳送給使用者
Server.py
@handler.add(PostbackEvent)
def handler_postback(event):
    prof = line_bot_api.get_profile(event.source.user_id)
    data = event.postback.data
    print(f"data:{data}")
    if(data == 'action=ShowShoppingCartContents'):
        cart_info, cart_amount = dbpm.QUY_Shopping_Cart_info_by_uid(event.source.user_id)
        app.logger.debug(f"{prof.display_name} 查詢購物車, uid:{event.source.user_id}, {cart_info}")
        replay_text = '\n'.join(str(v) for v in cart_info) + f"\n總共:{cart_amount}元"
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=replay_text)
        )
dbpm.py
def QUY_Shopping_Cart_info_by_uid(self, uid):
    scid = self.INS_QUY_SC(uid)
    prodlist = []
    tot_price = 0
    shopping_list = self.QUY_Shopping_Cart_by_scid(scid)
    if(not shopping_list):
        return False
    for prod in shopping_list:
        product_name, product_price = self.QUY_Prod_Name_and_Price_by_pid(prod[0])
        prodlist.append(f"{product_name} * {prod[1]}")
        tot_price = tot_price + product_price * prod[1]
    return prodlist, tot_price

加速趕工中,接下來還有從Line進行購物車內容物加減,查訂單